/*
 * One example for NOI CSP-J Lesson 7:
 * <https://courses.fmsoft.cn/plzs/noijunior-graph-and-graph-theory.html>
 *
 * Author: Vincent Wei
 *  - <https://github.com/VincentWei>
 *  - <https://gitee.com/vincentwei7>
 *
 * Copyright (C) 2025 FMSoft <https://www.fmsoft.cn>.
 * License: GPLv3
 */
#include <iostream>           // for std::cout
#include <vector>             // for std::vector

using namespace std;

// 使用矢量构成的矢量来表示邻接表。
// 注意，跟邻接矩阵不同，不能通过简单修改 int 为其他类型来表示负载；
// 这里的 int 表示一条边的终点索引值。
using adjacency_list = vector<vector<int>>;

// 无向边，相当于双向道
void addEdge(adjacency_list& graph, int u, int v)
{
    // 在表示顶点 u 的矢量中添加到顶点 v 的边
    graph[u].push_back(v);

    // 在表示顶点 v 的矢量中添加到顶点 u 的边
    graph[v].push_back(u);
}

// 输出邻接表，亦可通过重载 ostream 的 << 运算符实现该功能。
void dumpAdjList(ostream &os, const adjacency_list& graph)
{
    for (size_t i = 0; i < graph.size(); i++) {
        os << i << ": ";
        for (int j : graph[i]) {
            cout << j << " ";
        }
        os << endl;
    }
}

int main() {

    // 创建一个有三个顶点的无向图
    int V = 3;
    adjacency_list graph(V);

    // 逐个添加三条边
    addEdge(graph, 1, 0);
    addEdge(graph, 1, 2);
    addEdge(graph, 2, 0);

    cout << "Adjacency List Representation:" << endl;
    dumpAdjList(cout, graph);

    return 0;
}

